package com.suray.rgv;

import com.suray.basic.wcs.path.core.Node;
import com.suray.basic.wcs.utils.ModuleType;
import com.suray.rgv.instance.RgvInstance;
import com.suray.rgv.util.ErrorInfo;
import com.suray.type.RgvMapTagDirection;
import com.suray.wcs.res.enums.Order;
import com.suray.wcs.res.enums.PalletStatus;
import com.suray.wcs.res.enums.RgvStatus;
import com.suray.wcs.res.enums.RgvType;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 小车功能接口，基础接口，小车的基本功能可通过该接口来交互
 */
public interface RgvInterface {

    /**
     * 删除小车
     * @param serialNum
     * @return
     */
    static boolean deleteRgv(String serialNum) {
        return RgvInstance.deleteRgv(serialNum);
    }

    /**
     *
     * @param rgvNo
     * @param serialNum
     * @param ip
     * @param port : 如果不需要填null
     * @param rgvType
     * @return
     */
    static RgvInterface newRgv(int rgvNo, String serialNum, String ip, Integer port, ModuleType rgvType) {
        return RgvInstance.newRgv(rgvNo, serialNum, ip, port, rgvType);
    }

    /**
     * 获取小车
     * @param serialNum
     * @return
     */
    static RgvInterface getInstance(String serialNum) {
        return RgvInstance.get(serialNum);
    }

    /**
     * 获取对应类型的小车
     *
     * @param rgvType : null时返回所有的小车
     * @return
     */
    static Set<RgvInterface> getAllRgvs(RgvType rgvType) {
        return RgvInstance.getAllRgvs(rgvType);
    }

    /**
     * 发送地图给小车
     * @param mapNodes
     * @return
     */
    static void generalMap(String wareHouse,List<Node> mapNodes, ModuleType rgvType, RgvMapTagDirection direction) throws IOException {
        RgvInstance.generalMap(mapNodes, rgvType,wareHouse, direction);
    }

    /**
     * 添加地图
     * @param layer
     * @param mapName
     */
    static void addMap(int layer, String mapName) {
        RgvInstance.rgvMapManage.addMap(layer, mapName);
    }

    /**
     * 删除地图
     * @param layer
     */
    static void deleteMap(int layer) {
        RgvInstance.rgvMapManage.deleteMap(layer);
    }

    /**
     * 初始化地图
     * @param rgvMapMap
     */
    static void initMap(Map<Integer, String> rgvMapMap) {
        RgvInstance.rgvMapManage.initMap(rgvMapMap);
    }

    /**
     * 初始化小车
     */
    void init();

    /**
     * 初始化网络
     * @param ip
     * @param port
     */
    void initNet(String ip, int port);

    /**
     * 获取小车序列号
     * @return
     */
    String getSeries();

    /**
     * 下发小车任务
     * 任务完成后seed自动释放
     *
     * @param taskId :任务id，用于回报任务模块任务完成
     * @param pathNodes :任务节点
     * @return
     */
    boolean task(Object taskId, List<Node> pathNodes);

    /**
     * 任务是否结束
     * @param taskId
     * @return
     */
    boolean isTaskEnd(int taskId);

    /**
     * 指令是否结束
     * @param action
     * @return
     */
    boolean isActionEnd(Order action);

    /**
     * 获取WCS任务id
     * @return
     */
    Object getTaskId();

    /**
     * 小车当前任务编号
     *
     * @return
     */
    int getTaskNo();

    /**
     * 下发指令
     * 如果参数默认可以使用该接口，对参数有需求使用下面的接口
     *
     * @param rgvActionType :指令类型
     * @return
     */
    boolean action(Order rgvActionType);

    /**
     * 下发指令
     * 有特殊需求使用
     *
     * @param rgvActionType :指令类型
     * @param actionParam :指令参数
     * @return
     */
    boolean action(Order rgvActionType, Object actionParam);

    /**
     * 同步小车位置
     * @param node
     * @return
     */
    boolean changeLocation(Node node);

    /**
     * 获取最高故障
     *
     * @return
     */
    ErrorInfo getErrorInfo();

    /**
     * 获取所有故障
     *
     * @return
     */
    List<ErrorInfo> getErrorInfos();

    /**
     * 清除故障
     * @param error
     */
    void clearError(ErrorInfo error);

    /**
     * 清除所有故障
     */
    void clearAllError() throws IOException;

    /**
     * 清除任务
     */
    void clearTask() throws IOException;

    /**
     * 故障恢复
     */
    boolean recovery() throws IOException;

    /**
     * 获取小车当前坐标
     *
     * @return
     */
    Node getLocation();

    /**
     * 获取小车状态
     *
     * @return
     */
    RgvStatus getRgvStatus();

//    /**
//     * 小车是否能够接收任务
//     *
//     * @return
//     */
//    boolean isRgvReady();

    /**
     * 托盘状态
     *
     * @return
     */
    PalletStatus getRgvPalletStatus();

    /**
     * 获取小车电量
     *
     * @return
     */
    Float getBatSoc();

    /**
     * 获取电池温度
     *
     * @return
     */
    Float getBatTemp();

    /**
     * 获取电池电压
     *
     * @return
     */
    Float getBatVolt();

    /**
     * 获取电池电流
     *
     * @return
     */
    Float getBatCurrent();

    /**
     * 获取充电次数
     *
     * @return
     */
    Integer getBatChargeNum();

    /**
     * 获取自动充电电量
     * @return
     */
    Float getAutoChargeBattery();

    /**
     * 获取强制充电电量
     * @return
     */
    Integer getForceChargeBattery();

    /**
     * 是否禁用
     * @return
     */
    boolean isForbidden();

    /**
     * 是否自动充电
     * @return
     */
    boolean isAutoCharge();

    /**
     * 小车是否可用
     * @return
     */
    boolean isRgvValid();

    /**
     * 获取小车网络地址
     * @return
     */
    String getNetId();

    /**
     * 获取小车地图
     * @return
     */
    String getMap();

    /**
     * 获取小车编号
     * @return
     */
    int getRgvNo();

    /**
     * 停止小车任务
     */
    boolean stopTask();

    /**
     * 取消任务
     * @param taskId
     */
    void cancelTask(int taskId);

    /**
     * 急停
     * @return
     */
    boolean emergencyStop();

    /**
     * 获取小车类型
     * @return
     */
    RgvType getRgvType();

    /**
     * 发送地图给小车
     * @return
     */
    void sendMap(String wareHouse) throws IOException;

    /**
     * 下载小车地图
     * @return
     */
    String downloadMap(String mapName) throws IOException;

    /**
     * 删除地图
     * @param mapName 地图名称
     * @throws IOException
     */
    public void deleteMap(String mapName) throws IOException;

    /**
     * 获取名字
     * @return
     */
    String getName();

    /**
     * 是否在线
     * @return
     */
    boolean isOnline();

    /**
     * 设置中断
     */
    void setInterrupt() throws IOException;

    /**
     * 小车变成故障状态
     * @param errorInfo
     */
    void rgvError(ErrorInfo errorInfo);

    /**
     * 前进
     */
    void forwardRun();

    /**
     * 后退
     */
    void fallBackRun();

    /**
     * 左转
     */
    void turnLeft();

    /**
     * 右转
     */
    void turnRight();

    /**
     * 停止手动行驶
     */
    void stopManualMove();

    /**
     * 是否充电中
     * @return
     */
    boolean isCharging();

    /**
     * 车辆是否是静止的
     * @return
     */
    boolean isStatic();

    /**
     * 位置是否正确
     * @return
     */
    boolean positionOk();

    /**
     * 销毁小车
     */
    void destroy();
}
